import { Configuration, OpenAIApi } from 'openai'
import { API_KEY, PROXY_PORT, PROXY_URL } from '../config/index.js'

const configuration = new Configuration({
  apiKey: API_KEY
})

const openai = new OpenAIApi(configuration)

export const useOpenAiGPT= async (message, onProgress, finishEnd) => {
  try {
    let texts = ''
    // 调用openai官网库
    const streamResponse = await openai.createChatCompletion(
      {
        model: 'gpt-3.5-turbo',
        messages: [
          { 
            role: 'user', 
            content: message 
          }
        ],
        // 开启流式数据，数据是逐个字逐个字的形式返回 
        // 没开启则是等所有内容生成后返回，用户体验较差
        stream: true
      },
      {
        responseType: 'stream',
        // 外国服务器可省略代理
        proxy: {
          host: PROXY_URL,
          port: PROXY_PORT
        }
      }
    )
    // 监听流式数据响应
    streamResponse.data.on('data', (chunk) => {
      // 数据流为Buffer，这里直接用toString转换
      const payloads = chunk.toString().split('\n\n')
      console.log(payloads)
      for(const payload of payloads) {
        if(payload.includes('[DONE]')) return
        if(payload.startsWith('data:')) {
          // openai返回的数据格式是字符串： “data: {"choices": [{ "delta": {"content": "x"} }]}”
          // 字符串 `data: `必须去掉，否则JSON.parse解析是会崩
          const data = JSON.parse(payload.replace('data: ', ''))
          try {
            // 取真正返回的内容
            const chunk = data.choices[0].delta?.content
            if(chunk) {
              // console.log(chunk)
              texts += chunk
              // 流式响应返回给客户端函数
              onProgress(chunk)
            }
          } catch(err) {
            console.error('ERROR WITH JSON PARSE AND :', payload, err)
          }
        }
      }
    })

    streamResponse.data.on('end', () => {
      console.log('\nStream done')
      finishEnd(texts)
    })
    streamResponse.data.on('error', (err) => {
      console.log(err)
      finishEnd(JSON.stringify(err))
    })
  } catch(err) {
    console.error('useOpenAiGPT 报错：', err)
  }
}
